#include <opencv/cv.h>
#include <opencv/highgui.h>

#include <QString>
#include <QStringList>
#include <QTextStream>
#include <QFile>
#include <QColor>

#include <stdio.h>
#include <math.h>

#include "QCVGraph.h"

#ifndef CLUT_H
#define CLUT_H

/****************************************
//FONCTIONS GENERIQUES
*****************************************/

//Fonction de chargement d'une Color LookUp Table
bool loadCLUT(QString filename, cv::Mat & clut);

//Fonction de sauvegarde d'une CLUT
void saveCLUT(QString filename, cv::Mat & clut);

//Fonction de chargement d'une Color LookUp Table de type FUZZY_CLUT
bool loadFuzzyCLUT(QString filename, cv::Mat & fuzzyclut); //test: ok

//Fonction de sauvegarde d'une FUZZY_CLUT
void saveFuzzyCLUT(QString filename, cv::Mat & fuzzyclut); //test: ok

//Creation d'une FUZZY_CLUT par chargement de donnees d'enquettes;
bool createFuzzyCLUT(QString filename, int res, int depth, cv::Mat & fuzzyclut);

//Normalisation d'une FUZZY_CLUT
void normalize(cv::Mat & fuzzyclut);

//Conversion d'une image RGB en composantes Fuzzy en fonction de la FUZZY_CLUT
void RGB_2_Fuzzy(cv::Mat & src, cv::Mat & fuzzyclut, cv::Mat & des);//test: ok

//Retourne une image avec les composantes maximums de l'image source de type FUZZY_CLUT (voir fonction precedente)
void maxFuzzy(cv::Mat & src, cv::Mat & des);//test: ok

//Construit une CLUT a partir des max d'une FUZZY_CLUT
void maxFuzzyCLUT_2_CLUT(cv::Mat & fuzzyclut, cv::Mat & clut);//test:ok

//Construit une CLUT a partir de l'entropie d'une FUZZY_CLUT
void entropyFuzzyCLUT_2_CLUT(cv::Mat & fuzzyclut, cv::Mat & clut);//test: ok

//Applique une CLUT le résultat est en NVG
void RGB_2_GRAY(cv::Mat & src, cv::Mat & clut, cv::Mat & des);

//Retourne la valeur de la CLUT a  r g b 
uchar CLUT(cv::Mat & clut,uchar r,uchar g,uchar b);

//Retourne la valeur de la FUZZY_CLUT a r g b classe
float FUZZY_CLUT(cv::Mat & fuzzyclut,uchar r,uchar g,uchar b,uchar classe);

//Modification des poids dune couleurs celaon un pas step 
void modifyWeightsFuzzyCLUT(cv::Mat & fuzzyclut,float step,uchar r,uchar g,uchar b,uchar C);

//Construit un graph des connexités de la CLUT
void getConnexGraph(cv::Mat & clut,int dim,int threshold, QCVGraph & graph);
void getConnexGraph(cv::Mat & clut,int dim,int threshold, cv::Mat & adjenceMat);
void getConnexGraphSurfaceWeighted(cv::Mat & clut,int dim,int threshold, cv::Mat & adjenceMat);



/****************************************
//FONCTIONS C11
*****************************************/

//Fonctions de gestion d'une conversion C11
void RGB_2_C11(cv::Mat & src, cv::Mat & clut11c, cv::Mat & des);//test: ok
void C11_2_RGB(cv::Mat & src, cv::Mat & des);//test: ok
void RGB_2_RGB11(cv::Mat & src, cv::Mat & clut11c, cv::Mat & des);//test: ok

//Fonction qui retourne un histogramme ponderé par l'entropie
void getEntropyHistRegionC11(cv::Mat & src, cv::Mat & entropy_src, cv::Mat & region_mask, cv::Mat & entropy_hist);

//Fonction qui retourne une liste ordonnée des principales couleurs 
QStringList getMainC11(cv::Mat & hist, int n); //test: ok

//Retourne le nom de la couleur C11 "n"
QString getC11Name(int n); //test: ok

//retourne la couleur correspondant a lindice C11
QColor getC11Color(int n);

//Fonction de création d'une CLUT11c par minimisation des distances
void get_C11_CLUT(cv::Mat & clut11c, int res);

/****************************************
//FONCTIONS C16
*****************************************/

//Fonctions de gestion d'une conversion C16 a partir d'une CLUT C11
void RGB_2_C16_fromC11(cv::Mat & src, cv::Mat & clut11c, cv::Mat & des);//test: ok
void RGB_2_RGB16_fromC11(cv::Mat & src, cv::Mat & clut11c, cv::Mat & des);//test: ok


//Fonction de gestion d'une conversion C16 a partir d'une clut C16
void CLUTC11_2_CLUTC16(cv::Mat & clut11c, cv::Mat & clut16c);
void RGB_2_C16(cv::Mat & src, cv::Mat & clut16c, cv::Mat & des);
void RGB_2_RGB16(cv::Mat & src, cv::Mat & clut16c, cv::Mat & des);
void C16_2_RGB(cv::Mat & src, cv::Mat & des);//test: ok


#endif
